===== le PKGBUILD =====

Le PKGBUILD est la recette de cuisine permettant de créer un package.
Le PKGBUILD est un fichier texte utilisé par //makepkg// pour compiler les sources d'une archive en binaire installable simplement par //pacman//.

== Pré-requis ==
Pour réaliser un PKGBUILD, vous devrez connaître les rouages de la compilation et l'édition de fichier texte.



==== Qu'est ce qu'un PKGBUILD et que contient-il ? ====

Un PKGBUILD est un fichier qui contient les informations sur un package. C'est un fichier au format texte. En voici un exemple :
<code bash># $Id: PKGBUILD,v 1.12 2003/11/06 08:26:13 dorphell Exp $
# Maintainer: judd <jvinet@zeroflux.org>
# Contributor: Judd Vinet <jvinet@zeroflux.org>
pkgname=foo
pkgver=0.99 # note: if the pkgver had been '0.99-10' then use an underscore. like '0.99_10'
pkgrel=1
pkgdesc="short description of foo"
arch=(i686 x86_64)
url="http://www.foo.org"
license=('GPL')
groups=
provides=
depends=('qt' 'python')
makedepends=('guile')
conflicts=('yafoo')
replaces=('mffoo')
backup=('etc/foo/foo.conf')
install=('foo.install')
source=(http://www.foo.org/download/$pkgname-$pkgver.tar.gz)
md5sums=('2c0cca3ef6330a187c6ef4fe41ecaa4d35175bee593a7cc7d6205584a94d8625')

build() {
  cd $startdir/src/$pkgname-$pkgver
  ./configure --prefix=/usr
  make || return 1
  make prefix=$startdir/pkg/usr install
}</code>

Analysons chaque champ :
  * ''# text'' : commentaires
  * ''# $Id'' : identification 
  * ''# Maintainer'' : Responsable officiel
  * ''# Contributor'' : Première personne à avoir écrit le PKGBUILD
  * ''pkgname'' : Nom du package, à positionner sur le nom du logiciel, en minuscule et sans - ou espace
  * ''pkgver'' : Version du **logiciel**
  * ''pkgrel'' : Numéro de création du package. Doit être positionné à 1 la première fois et incrémenté à chaque modification majeure du **PKGBUILD** d'une **même** version d'un **même** logiciel
  * ''pkgdesc'' : Description succinte du logiciel. C'est celle qui apparaitra lorsque vous ferez ''pacman -Qi $pkgname''
  * ''arch'' : Indication de l'architecture pour laquelle le programme peut-être compilé.
  * ''url'' : La page web relative au logiciel
  * ''license'' : La licence sous laquelle le logiciel est distribué
  * ''groups'' : Utile lorsque votre paquet doit apartenir à un "méta-paquet" (e.g. kdebase appartiens à kde)
  * ''provides'' : Si votre paquet fournit un autre logiciel (e.g. //kernel-scsi// fournit //kernel//)
  * ''depends'' : les dépendances nécessaires à l'exécution du logiciel
  * ''makedepends'' : les dépendances nécessaires à la compilation du logiciel
  * ''conflicts'' : certains paquets ne **peuvent** être utilisés simultanément, ce champ permet d'en tenir compte
  * ''replaces'' : Si votre paquet en remplace un autre
  * ''backup'' : les fichiers à restaurer lors de la désintallation
  * ''source'' : l'adresse des sources du documents. Il peut-être utile de réutiliser les champs //$pkgname// et //$pkgver//
  * ''md5sums'' : Somme de controle md5 des sources pour vérifier l'intégrité du paquet

Expliquons les fonctions contenus dans le PKGBUILD : 

  * build : Toutes les actions nécessaires pour compiler le paquet. (attention, ce n'est pas systématiquement ''./configure && make && make install'')

Avec tout cela, vous êtes déjà en mesure de créer vos propres paquets. Le PKGBUILD est la **base** de **tout** paquet.
Il existe aussi des fichiers d'installation. En voici un exemple:
<code bash>post_install() {
/bin/true
}

post_upgrade() {
/bin/true
}

pre_remove() {
/bin/true
}

op=$1
shift

$op "$@"</code>
\\
  * post_install : script exécuté après l'installation. Il prends comme argument le numéro de version.
  * post_upgrade : script exécuté après la mise à jour. Il prends comme arguments le nouveau numéro de version et l'ancien.
  * pre_remove : script exécuté avant la désinstallation. Il prends comme argument le numéro de version.

===== La fonction de construction : build =====

Si vous n'êtes pas familier avec la compilation d'un programme, sachez que la plus part d'entre eux se construisent de la façon suivante :
  - Récupération des sources : <code>wget http://www.foo.org/download/foo-0.99.tar.gz</code>
  - Décompression : <code>tar zxf foo-0.99.tar.gz && cd foo-0.99</code>
  - Configuration : <code>./configure [options]</code> Si vous ne connaissez pas les options, ou que vous avez un doute, n'hésitez pas à utiliser l'aide : ''./configure --help''.
  - Compilation : <code>make</code>
  - Installation : <code>make install</code>

Si vous avez le moindre doute, n'hésitez pas à lire le fichier **INSTALL** ou **README**.

Jettons donc un oeil à la fonction //build//
<code>build() {
  cd $startdir/src/$pkgname-$pkgver
  ./configure --prefix=/usr
  make || return 1
  make prefix=$startdir/pkg/usr install
}</code>

On a supposé que le répertoire des sources était ''src/$pkgname-$pkgver'', ce qui n'est pas toujours le cas, cela peut-être ''src/$pkgname''. ''./configure --prefix=/usr'' permet d'indiquer que le répertoire d'installation devra être ''/usr''. 
<code>make || return 1</code> permet de compiler le programme ou de sortir avec le code 1 en cas d'erreur. Et enfin, <code> make prefix=$startdir/pkg/usr install</code> permet d'installer le programme. Il faut noter que cette partie ce déroule dans un environnement ''fakeroot'', qui simule les droits de root dans une racine située dans ''$startdir''. Ceci permet donc de copier les fichiers dans le répertoire ''$startdir/pkg''. Le contenu de ce répertoire servira ensuite à créer le fichier **foo-0.99-1.pkg.tar.gz** Pour installer un tel paquet, il suffira de faire <code>pacman -U foo-0.99-1.pkg.tar.gz</code>((''sed s/pacman/yaourt/''))

//Je vous recommande vivement de créer un répertoire distinct pour chaque paquet que vous créez localement dans ''/var/abs/local''//

==== Que contient un package ====

Un package est un fichier (e.g. ''//toto//.pkg.tar.gz''). Ce fichier n'est ni plus ni moins qu'une archive contenant
  * les fichiers à installer (à copier)
  * .PKGINFO : contient les dépendances du paquets
  * .FILELIST : contient la liste des fichiers (utile en cas de désinstallation)
  * .INSTALL : nécessaire dans certains cas pour l'installation et la désinstallation


\\
Page traduite depuis [[http://wiki.archlinux.org/index.php/ABS_-_The_Arch_Build_System]]\\


===== En savoir d'avantage =====

  * [[:howto:archlinux:man_pkgbuild|page man francophone de PKGBUILD.5]]
  * [[:howto:archlinux:archpackagingstandards|Standard de création de paquetage pour Arch Linux]]

====== Crédit ======

 --- //[[vincentxavier@archlinux.fr|vincentxavier]] 26/11/2006 19:02//